package com.gitee.zhuyb.util;

import org.openxmlformats.schemas.drawingml.x2006.chart.*;
import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @version 1.0.0
 * @Description: 图表工具类
 * @Date: 2021/12/26 16:03
 * @Copyright (C) ZhuYouBin
 */
public class ChartUtil {

    /**
     * 刷新折线图图表
     *
     * @param lineChart     折线图图表对象
     * @param lines         折线图系列数量【线条数量】
     * @param position      位置,默认是1
     * @param firstRowTitle excel表格第一行的数据名称
     * @param firstColTitle excel表格每一列的数据名称【用于map获取数据】
     * @param rowDataList   excel每行需要填充的数据
     * @return
     */
    public static boolean refreshLineChart(CTLineChart lineChart, int lines, int position,
                                           List<String> firstRowTitle,
                                           List<String> firstColTitle,
                                           List<Map<String, String>> rowDataList) {
        // 刷新结果
        boolean refresh = true;

        // 遍历系列数量（线条数量）
        for (int i = 0; i < lines; i++) {
            try {
                CTLineSer ctLineSer = lineChart.addNewSer();
                ctLineSer.addNewIdx().setVal(i);
                ctLineSer.addNewOrder().setVal(i);

                // 设置折线图的系列名称
                // 设置标题 用以下这个方式，可以兼容office和wps（因为是动态添加，不可以直接get到，需要这样写）
                CTSerTx tx = ctLineSer.addNewTx();
                CTStrRef ctStrRef = tx.addNewStrRef();
                CTStrData ctStrData = ctStrRef.addNewStrCache();
                ctStrData.addNewPtCount().setVal(1);
                CTStrVal ctStrVal = ctStrData.addNewPt();
                ctStrVal.setIdx(0);
                // 设置系列的名称
                ctStrVal.setV(firstRowTitle.get(i + 1));

                // 设置折线图系列的颜色，就是显示的柱子的颜色，不设置的话会默认都是黄色
                // 必须使用ACCENT_x系列的才行
//            CTSchemeColor ctSchemeColor = ctLineSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSchemeClr();
//            ctSchemeColor.setVal(STSchemeColorValTools.get(i));

                CTAxDataSource cat = ctLineSer.addNewCat();
                CTNumDataSource val = ctLineSer.addNewVal();

                CTStrData strData = cat.addNewStrRef().addNewStrCache();
                CTNumData numData = val.addNewNumRef().addNewNumCache();
                strData.setPtArray((CTStrVal[]) null); // unset old axis text
                numData.setPtArray((CTNumVal[]) null); // unset old values

                // 填充数据
                long index = 0;
                for (int j = 0; j < rowDataList.size(); j++) {
                    // 获取数据行
                    Map<String, String> dataMap = rowDataList.get(j);
                    // 获取单元格数据
                    String value = dataMap.get(firstColTitle.get(i + position));
                    if (value == null || "".equals(value.trim())) {
                        value = "0";
                    }

                    // 设置系列名称
                    CTStrVal sVal = strData.addNewPt();//序列名称
                    sVal.setIdx(index);
                    sVal.setV(dataMap.get(firstColTitle.get(0)));

                    // 设置value值
                    CTNumVal numVal = numData.addNewPt();//序列值
                    numVal.setIdx(index);
                    numVal.setV(value);
                    // 索引值自增加1
                    index++;
                }

                numData.addNewPtCount().setVal(index);
                strData.addNewPtCount().setVal(index);
            } catch (Exception e) {
                e.printStackTrace();
                refresh = false;
            }
        }

        return refresh;
    }

    /**
     * 刷新柱状图图表
     *
     * @param barChart      柱状图图表对象
     * @param bars          柱状图系列数量,也就是同一分类柱子的数量
     * @param position      位置,默认是1
     * @param firstRowTitle excel表格第一行的数据名称
     * @param firstColTitle excel表格每一列的数据名称【用于map获取数据】
     * @param rowDataList   excel每行需要填充的数据
     * @return
     */
    public static boolean refreshBarChart(CTBarChart barChart, int bars, int position,
                                          List<String> firstRowTitle,
                                          List<String> firstColTitle,
                                          List<Map<String, String>> rowDataList) {
        // 刷新结果
        boolean refresh = true;

        //更新数据区域
        for (int i = 0; i < bars; i++) {
            try {
                CTBarSer ctBarSer = barChart.addNewSer();
                ctBarSer.addNewIdx().setVal(i);
                ctBarSer.addNewOrder().setVal(i);

                // 设置柱状图的系列名称
                // 设置标题 用以下这个方式，可以兼容office和wps（因为是动态添加，不可以直接get到，需要这样写）
                CTSerTx tx = ctBarSer.addNewTx();
                CTStrRef ctStrRef = tx.addNewStrRef();
                CTStrData ctStrData = ctStrRef.addNewStrCache();
                ctStrData.addNewPtCount().setVal(1);
                CTStrVal ctStrVal = ctStrData.addNewPt();
                ctStrVal.setIdx(0);
                ctStrVal.setV(firstRowTitle.get(i + 1));  // 设置系列的名称

                // 设置柱状图系列的颜色，就是显示的柱子的颜色，不设置的话会默认都是黄色
                // 必须使用ACCENT_x系列的才行
//            CTSchemeColor ctSchemeColor = ctBarSer.addNewSpPr().addNewSolidFill().addNewSchemeClr();
//            ctSchemeColor.setVal(STSchemeColorValTools.get(i));

                CTAxDataSource cat = ctBarSer.addNewCat();
                CTNumDataSource val = ctBarSer.addNewVal();

                CTStrData strData = cat.addNewStrRef().addNewStrCache();
                CTNumData numData = val.addNewNumRef().addNewNumCache();
                strData.setPtArray((CTStrVal[]) null); // unset old axis text
                numData.setPtArray((CTNumVal[]) null); // unset old values

                // 填充图表数据
                long index = 0;
                for (int j = 0; j < rowDataList.size(); j++) {
                    // 获取数据行
                    Map<String, String> dataMap = rowDataList.get(j);
                    // 获取单元格数据
                    String value = dataMap.get(firstColTitle.get(i + position));
                    if (value == null || "".equals(value.trim())) {
                        value = "0";
                    }

                    // 设置系列名称
                    CTStrVal sVal = strData.addNewPt();//序列名称
                    sVal.setIdx(index);
                    sVal.setV(dataMap.get(firstColTitle.get(0)));

                    // 设置value值
                    CTNumVal numVal = numData.addNewPt();//序列值
                    numVal.setIdx(index);
                    numVal.setV(value);
                    // 索引值自增加1
                    index++;
                }

                numData.addNewPtCount().setVal(index);
                strData.addNewPtCount().setVal(index);
            } catch (Exception e) {
                e.printStackTrace();
                refresh = false;
            }
        }
        return refresh;
    }

}
